/**
 * 
 */
package org.alipay4j.component.life;

import java.util.HashMap;
import java.util.Map;

import org.alipay4j.Alipay;
import org.alipay4j.AlipayException;
import org.alipay4j.Configuration;
import org.alipay4j.component.AbstractComponent;
import org.alipay4j.http.AlipayHttpsClient;
import org.alipay4j.http.Response;
import org.alipay4j.model.qrcode.Qrcode;
import org.alipay4j.util.ObjectHelper;

import com.alibaba.fastjson.JSONObject;

/**
 * 二维码操作组件
 * @author heliang
 *
 */
public class QrcodeComponent extends AbstractComponent {

	public QrcodeComponent(Alipay alipay) {
		super(alipay);
	}
	
	/**
	 * 创建临时渠道二维码
	 * @param scene_id 场景id
	 * @param goto_url 关注后跳转地址
	 * @return Qrcode 二维码信息对象
	 * @throws AlipayException
	 */
	public Qrcode qrcodeTempCreate(String scene_id,String goto_url) throws AlipayException {
		return qrcodeCreate(scene_id, goto_url, null, "Y");
	}
	
	/**
	 * 创建永久渠道二维码
	 * @param scene_id 场景id
	 * @param goto_url 关注后跳转地址
	 * @return Qrcode 二维码信息对象
	 * @throws AlipayException
	 */
	public Qrcode qrcodePermCreate(String scene_id,String goto_url) throws AlipayException {
		return qrcodeCreate(scene_id, goto_url, "PERM", "Y");
	}
	
	/**
	 * 带参推广二维码接口
	 * 为了满足用户渠道推广分析的需要，公众平台提供了生成带参数二维码的接口。使用该接口可以获得多个带不同场景值的二维码，
	 * 用户扫描后，公众号可以接收到事件推送。目前有2种类型的二维码，分别是临时二维码、和永久二维码，
	 * 前者有过期时间，最大为1800秒。 每次创建二维码ticket需要提供一个开发者自行设定的参数（scene_id）。
	 * @param scene_id 场景Id
	 * @param goto_url 跳转URL，扫码关注服务窗后会直接跳转到此URL
	 * @param code_type 二维码类型，目前只支持两种类型：  TEMP：临时的（默认）；  PERM：永久的
	 * @param expire_second 临时码过期时间，以秒为单位，最大不超过1800秒； 永久码置空
	 * @param show_logo 二维码中间是否显示服务窗logo，Y：显示；N：不显示（默认）
	 * @return Qrcode
	 * @throws AlipayException
	 */
	public Qrcode qrcodeCreate(String scene_id,String goto_url,String code_type,String show_logo) throws AlipayException {
		if (ObjectHelper.isEmpty(scene_id)) {
            throw new IllegalArgumentException("scene_id can't be null or empty");
        }
		//组装请求参数
		Map<String, String> body = new HashMap<String, String>();
		body.put("scene_id", "{\"code_info\":{\"scene\":{\"scene_id\":\""+scene_id+"\"}");
		body.put("goto_url", goto_url);
		body.put("show_logo", show_logo);
		if(ObjectHelper.isEmpty(code_type)||"TEMP".equals(code_type)) {
			body.put("code_type", "TEMP");
			body.put("expire_second", "1800");
		} else {
			body.put("code_type", code_type);
		}
		body.put("method", "alipay.open.public.qrcode.create");
		Response response = new AlipayHttpsClient(super.alipay).postBizContent(body);
		//根据请求结果判定，是否验证成功
		JSONObject bodyRes = getObjRes(response, "alipay_open_public_qrcode_create_response");
		if (Configuration.isDebug()) {
	        System.out.println("alipay_open_public_qrcode_create_response返回json：" + bodyRes.toString());
	    }
	    String codeRes = bodyRes.getString("code");
	    if (ObjectHelper.isNotEmpty(codeRes)&&!"10000".equals(codeRes)) {
	    	String sub_code = bodyRes.getString("sub_code");
	    	String sub_msg = bodyRes.getString("sub_msg");
	        //返回异常信息
	        throw new AlipayException(getCause(sub_code,sub_msg));
	    }
	    Qrcode qrcode = JSONObject.toJavaObject(bodyRes, Qrcode.class);
		return qrcode;
	}

}
